<?php
/**
 * 7、设计模式学习-装饰器模式
 * 打印字符串控制器
 * 2019年12月10日16:34:48
 */
namespace Application\Controller;

use Application\Common\Decorator\Echos as Echos;
use Application\Common\Decorator\ColorDecorator as ColorDecorator;
use Application\Common\Decorator\BorderDecorator as BorderDecrator;

class EchosDecoratorController extends BaseController
{
    // 没有使用装饰器模式
    public function noUseDecorator()
    {
        $echos = new Echos();
        echo '<style>#echo_first{color:red}</style>';
        echo '<style>#echo_first{border:1px solid green;}</style>';
        $echos -> display();
        // 总结 1：直接编写样式代码，较为简单，但不能做到复用。
        // 总结 2：可以直接编写一个子类继承 Echos ，但重写方法 display 较为复杂，且无法复用代码到其他的类中。
    }
    // 使用装饰器模式
    public function useDecorator()
    {
        $echos = new Echos();
        // 实例化装饰器
        $color = new ColorDecorator($echos);
        $border = new BorderDecrator();
        $border -> setDecoratored($color);
        $border -> display();
        // 总结：代码更为灵活，可以复用，不同装饰之间不相互干扰
        // 关键之处：被装饰器类与装饰器类的方法为同名方法，所以引用后，才能层层自动调用。
    }
}
